/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package quanlisinhvien.bll;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import quanlisinhvien.dal.SinhVienDAO;
import quanlisinhvien.dto.KhoaDTO;
import quanlisinhvien.dto.LopDTO;
import quanlisinhvien.dto.SinhVienDTO;

/**
 *
 * @author Marshmallow
 */
public class SinhVienBLL {
    
    private SinhVienDAO sinhVienDAO;

    public SinhVienBLL() {
        this.sinhVienDAO = new SinhVienDAO();
    }
    
    public float TinhDiemTrungBinh(SinhVienDTO sinhVien){
        return (sinhVien.getDiemMon1() + sinhVien.getDiemMon2() + sinhVien.getDiemMon3())/3;
    }
    
    public String XepLoai(SinhVienDTO sinhVien){
        float diemTrungBinh = this.TinhDiemTrungBinh(sinhVien);        
        if (diemTrungBinh >= 8.5) return "Giỏi";
        if (diemTrungBinh >= 6.5) return "Khá";
        if (diemTrungBinh >= 4) return "Trung bình";
        return "Yếu";
    }
    
    public List<SinhVienDTO> LayDanhSachSinhVien(){
        try{
            List<SinhVienDTO> danhSach = new ArrayList<SinhVienDTO>();
            ResultSet rs = this.sinhVienDAO.LayDanhSachSinhVien();
            while (rs.next()){
                SinhVienDTO sinhVien = new SinhVienDTO();
                sinhVien.setMaSinhVien(rs.getString("maSinhVien"));
                sinhVien.setHoTen(rs.getString("hoTen"));
                sinhVien.setGioiTinh(rs.getInt("gioiTinh") == 1 ? "Nữ" : "Nam"); // 1: Nữ - 0: Nam
                sinhVien.setNgaySinh(rs.getDate("ngaySinh"));
                sinhVien.setDiaChi(rs.getString("diaChi"));
                sinhVien.setDiemMon1(rs.getFloat("diemMon1"));
                sinhVien.setDiemMon2(rs.getFloat("diemMon2"));
                sinhVien.setDiemMon3(rs.getFloat("diemMon3"));   
                
                KhoaDTO khoa =new KhoaDTO();
                khoa.setMaKhoa(rs.getInt("khoa.maKhoa"));
                khoa.setTenKhoa(rs.getString("tenKhoa"));
                
                LopDTO lop =new LopDTO();
                lop.setMaLop(rs.getInt("lop.maLop"));
                lop.setTenLop(rs.getString("tenLop"));
                lop.setKhoa(khoa);
                
                sinhVien.setLop(lop);
                danhSach.add(sinhVien);
            }
            return danhSach;
        }
        catch (Exception ex){
            System.out.println("From SinhVienBLL" + ex.getMessage());
            return null;
        }
    }
     
    public SinhVienDTO LaySinhVienTheoMa(String maSinhVien){
        try{
            SinhVienDTO sinhVien = new SinhVienDTO();
            ResultSet rs = this.sinhVienDAO.LaySinhVienTheoMa(maSinhVien);
            while (rs.next()){
                sinhVien.setMaSinhVien(rs.getString("maSinhVien"));
                sinhVien.setHoTen(rs.getString("hoTen"));
                sinhVien.setGioiTinh(rs.getInt("gioiTinh") == 1 ? "Nữ" : "Nam"); // 1: Nữ - 0: Nam
                sinhVien.setNgaySinh(rs.getDate("ngaySinh"));
                sinhVien.setDiaChi(rs.getString("diaChi"));
                sinhVien.setDiemMon1(rs.getFloat("diemMon1"));
                sinhVien.setDiemMon2(rs.getFloat("diemMon2"));
                sinhVien.setDiemMon3(rs.getFloat("diemMon3"));   
                
                LopDTO lop = new LopDTO();
                lop.setMaLop(rs.getInt("maLop"));
                
                sinhVien.setLop(lop);
            }
            return sinhVien;
        }
        catch (Exception ex){
            System.out.println("From SinhVienBLL" + ex.getMessage());
            return null;
        }
    }
    
    public boolean KiemTraMaSV(String maSinhVien){
        List<SinhVienDTO> danhSachSinhVien = this.LayDanhSachSinhVien();
        for (SinhVienDTO sinhVien : danhSachSinhVien){
            if (sinhVien.getMaSinhVien().equals(maSinhVien))
                return false;
        }
        return true;
    }
    
    public boolean ThemSinhVien(SinhVienDTO sinhVien){
        if (this.KiemTraMaSV(sinhVien.getMaSinhVien())){
            return this.sinhVienDAO.ThemSinhVien(sinhVien);
        }
        else{
            System.out.println("Mã này đã tồn tại");
            return false;
        }           
    }
    
    public boolean CapNhatSinhVien(SinhVienDTO sinhVien){
        return this.sinhVienDAO.CapNhatSinhVien(sinhVien);
    }
    
    public boolean XoaSinhVien(String maSinhVien){
        return this.sinhVienDAO.XoaSinhVien(maSinhVien);
    }
    
    public List<SinhVienDTO> TimKiemSinhVien(SinhVienDTO sinhVienCanTim){
        List<SinhVienDTO> danhSach = new LinkedList<SinhVienDTO>();
        danhSach = this.LayDanhSachSinhVien();
        
        //Loại bỏ các sinh viên có tên khoa khác với tên khoa cần tìm
        if (sinhVienCanTim.getLop().getKhoa() != null && !sinhVienCanTim.getLop().getKhoa().getTenKhoa().equals("")){
            for (int i = danhSach.size()-1 ; i >= 0; i--)
                if (!sinhVienCanTim.getLop().getKhoa().getTenKhoa().equals(danhSach.get(i).getLop().getKhoa().getTenKhoa())) {
                    danhSach.remove(i);
                }
        }
        
        //Loại bỏ các sinh viên có tên lớp khác với tên lớp cần tìm
        if (sinhVienCanTim.getLop() != null && !sinhVienCanTim.getLop().getTenLop().equals("")){
            for (int i = 0 ; i < danhSach.size(); i++)
                if (!sinhVienCanTim.getLop().getTenLop().equals(danhSach.get(i).getLop().getTenLop())){
                     danhSach.remove(i);
                }
        }
        
         //Loại bỏ các sinh viên có họ tên không chứa các từ khóa tìm kiếm
        if (!sinhVienCanTim.getHoTen().equals("")){
            for (int i = danhSach.size()-1 ; i >= 0; i--)
               if (!danhSach.get(i).getHoTen().contains(sinhVienCanTim.getHoTen())){
                    danhSach.remove(i);
                }
        }
        
        //Loại bỏ các sinh viên có mã sinh viên khác với mã cần tìm
        if (!sinhVienCanTim.getMaSinhVien().equals("")){
             for (int i = danhSach.size()-1 ; i >= 0; i--)
                if (!sinhVienCanTim.getMaSinhVien().equals(danhSach.get(i).getMaSinhVien())){
                    danhSach.remove(i);
                }
        }
        
         //Loại bỏ các sinh viên có địa chỉ không chứa các từ khóa tìm kiếm
        if (!sinhVienCanTim.getDiaChi().equals("")){
             for (int i = danhSach.size()-1 ; i >= 0; i--)
                if (!danhSach.get(i).getDiaChi().contains(sinhVienCanTim.getDiaChi())){
                    danhSach.remove(i);
                }           
        }
        
        return danhSach;
    }
            
}
